#ifndef SYSROOT_SYSLOG_H_
#define SYSROOT_SYSLOG_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>

#define LOG_EMERG 0
#define LOG_ALERT 1
#define LOG_CRIT 2
#define LOG_ERR 3
#define LOG_WARNING 4
#define LOG_NOTICE 5
#define LOG_INFO 6
#define LOG_DEBUG 7

#define LOG_PRIMASK 7
#define LOG_PRI(p) ((p)&LOG_PRIMASK)
#define LOG_MAKEPRI(f, p) (((f) << 3) | (p))

#define LOG_MASK(p) (1 << (p))
#define LOG_UPTO(p) ((1 << ((p) + 1)) - 1)

#define LOG_KERN (0 << 3)
#define LOG_USER (1 << 3)
#define LOG_MAIL (2 << 3)
#define LOG_DAEMON (3 << 3)
#define LOG_AUTH (4 << 3)
#define LOG_SYSLOG (5 << 3)
#define LOG_LPR (6 << 3)
#define LOG_NEWS (7 << 3)
#define LOG_UUCP (8 << 3)
#define LOG_CRON (9 << 3)
#define LOG_AUTHPRIV (10 << 3)
#define LOG_FTP (11 << 3)

#define LOG_LOCAL0 (16 << 3)
#define LOG_LOCAL1 (17 << 3)
#define LOG_LOCAL2 (18 << 3)
#define LOG_LOCAL3 (19 << 3)
#define LOG_LOCAL4 (20 << 3)
#define LOG_LOCAL5 (21 << 3)
#define LOG_LOCAL6 (22 << 3)
#define LOG_LOCAL7 (23 << 3)

#define LOG_NFACILITIES 24
#define LOG_FACMASK 0x3f8
#define LOG_FAC(p) (((p)&LOG_FACMASK) >> 3)

#define LOG_PID 0x01
#define LOG_CONS 0x02
#define LOG_ODELAY 0x04
#define LOG_NDELAY 0x08
#define LOG_NOWAIT 0x10
#define LOG_PERROR 0x20

void closelog(void);
void openlog(const char*, int, int);
int setlogmask(int);
void syslog(int, const char*, ...);

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define _PATH_LOG "/dev/log"
#define __NEED_va_list
#include <bits/alltypes.h>
void vsyslog(int, const char*, va_list);
#if defined(SYSLOG_NAMES)
#define INTERNAL_NOPRI 0x10
#define INTERNAL_MARK (LOG_NFACILITIES << 3)
typedef struct {
  char* c_name;
  int c_val;
} CODE;
#define prioritynames                              \
  ((CODE*)(const CODE[]){{"alert", LOG_ALERT},     \
                         {"crit", LOG_CRIT},       \
                         {"debug", LOG_DEBUG},     \
                         {"emerg", LOG_EMERG},     \
                         {"err", LOG_ERR},         \
                         {"error", LOG_ERR},       \
                         {"info", LOG_INFO},       \
                         {"none", INTERNAL_NOPRI}, \
                         {"notice", LOG_NOTICE},   \
                         {"panic", LOG_EMERG},     \
                         {"warn", LOG_WARNING},    \
                         {"warning", LOG_WARNING}, \
                         {0, -1}})
#define facilitynames                                \
  ((CODE*)(const CODE[]){{"auth", LOG_AUTH},         \
                         {"authpriv", LOG_AUTHPRIV}, \
                         {"cron", LOG_CRON},         \
                         {"daemon", LOG_DAEMON},     \
                         {"ftp", LOG_FTP},           \
                         {"kern", LOG_KERN},         \
                         {"lpr", LOG_LPR},           \
                         {"mail", LOG_MAIL},         \
                         {"mark", INTERNAL_MARK},    \
                         {"news", LOG_NEWS},         \
                         {"security", LOG_AUTH},     \
                         {"syslog", LOG_SYSLOG},     \
                         {"user", LOG_USER},         \
                         {"uucp", LOG_UUCP},         \
                         {"local0", LOG_LOCAL0},     \
                         {"local1", LOG_LOCAL1},     \
                         {"local2", LOG_LOCAL2},     \
                         {"local3", LOG_LOCAL3},     \
                         {"local4", LOG_LOCAL4},     \
                         {"local5", LOG_LOCAL5},     \
                         {"local6", LOG_LOCAL6},     \
                         {"local7", LOG_LOCAL7},     \
                         {0, -1}})
#endif
#endif

#ifdef __cplusplus
}
#endif

#endif  // SYSROOT_SYSLOG_H_
